package logica.util;


public class Endereco {
	
	private UF estado;
	private String cidade;
	private String bairro;
	private TipoDeLogradouro tipoDeLogradouro;
	private String logradouro;
	private int numero;
	private String cep;
	private String observacao;
	
	/**
	 * Constroi um objeto do tipo Endereco.
	 * @param estado UF - O estado do endereco
	 * @param cidade String - A cidade do endereco
	 * @param bairro String - O bairro do endereco
	 * @param logradouro String - O logradouro do endereco
	 * @param tipoDeLogradouro TipoDeLogradouro - O tipo de logradouro do endereco
	 * @param numero int - O numero do endereco
	 * @param cep String - O numero do CEP do endereco
	 * @param observacao String - Uma observacao a respeito do endereco
	 * @throws Exception Se A cidade, o bairro, o logradouro ou o CEP forem nulos ou vazios, se o CEP contiver algum caractere nao-numerico ou se o numero for menor ou igual a 0
	 */
	
	public Endereco(UF estado, String cidade, String bairro,
		TipoDeLogradouro tipoDeLogradouro, String logradouro, 
		int numero, String cep, String observacao) throws Exception {
		
		if (cidade.trim().isEmpty() || cidade == null) {
			throw new Exception("Cidade invalida.");
		} else if (bairro.trim().isEmpty() || bairro == null) {
			throw new Exception("Bairro invalido.");
		} else if (logradouro.trim().isEmpty() || logradouro == null) {
			throw new Exception("Logradouro invalido.");
		} else if (numero <= 0) {
			throw new Exception("Numero invalido.");
		} else if (cep.trim().isEmpty() || cep == null || !(validaCEP(cep))) {
			throw new Exception("CEP invalido.");
		}
 
		this.estado = estado;
		this.cidade = cidade;
		this.bairro = bairro;
		this.logradouro = logradouro;
		this.tipoDeLogradouro = tipoDeLogradouro;
		this.numero = numero;
		this.cep = cep;
		this.observacao = observacao;
	}
	
	/**
	 * Mostra o estado do endereco.
	 * @return UF - O estado do endereco
	 */
	
	public UF getEstado() {
		return estado;
	}

	/**
	 * Muda o estado do endereco.
	 * @param estado UF - O novo estado
	 */

	public void setEstado(UF estado) {
		this.estado = estado;
	}

	/**
	 * Mostra a cidade do endereco.
	 * @return String - A cidade do endereco
	 */

	public String getCidade() {
		return cidade;
	}

	/**
	 * Muda a cidade do endereco.
	 * @param cidade String - A nova cidade
	 * @throws Exception Se a nova cidade for nula ou vazia
	 */

	public void setCidade(String cidade) throws Exception {
		if (cidade.trim().isEmpty() || cidade == null) {
			throw new Exception("Cidade invalida.");
		}
		
		this.cidade = cidade;
	}

	/**
	 * Mostra o bairro do endereco.
	 * @return String - O bairro do endereco
	 */

	public String getBairro() {
		return bairro;
	}

	/**
	 * Muda o bairro do endereco.
	 * @param bairro String - O novo bairro
	 * @throws Exception Se o novo bairro for nulo ou vazio
	 */

	public void setBairro(String bairro) throws Exception {
		if (bairro.trim().isEmpty() || bairro == null) {
			throw new Exception("Bairro invalido.");
		} 
		
		this.bairro = bairro;
	}

	/**
	 * Mostra o logradouro do endereco.
	 * @return String - O logradouro do endereco
	 */

	public String getLogradouro() {
		return logradouro;
	}

	/**
	 * Muda o logradouro do endereco.
	 * @param logradouro String - O novo logradouro
	 * @throws Exception Se o novo logradouro for nulo ou vazio
	 */

	public void setLogradouro(String logradouro) throws Exception {
		if (logradouro.trim().isEmpty() || logradouro == null) {
			throw new Exception("Logradouro invalido.");
		} 
		
		this.logradouro = logradouro;
	}

	/**
	 * Mostra o tipo de logradouro do endereco.
	 * @return TipoDeLogradouro - O tipo de logradouro do endereco
	 */

	public TipoDeLogradouro getTipoDeLogradouro() {
		return tipoDeLogradouro;
	}

	/**
	 * Muda o tipo de logradouro do endereco.
	 * @param tipoDeLogradouro TipoDeLogradouro - O novo tipo de logradouro
	 */

	public void setTipoDeLogradouro(TipoDeLogradouro tipoDeLogradouro) {
		this.tipoDeLogradouro = tipoDeLogradouro;
	}

	/**
	 * Mostra o numero do endereco.
	 * @return int - O numero do endereco
	 */

	public int getNumero() {
		return numero;
	}

	/**
	 * Muda o numero do endereco.
	 * @param numero int - O novo numero
	 * @throws Exception Se o novo numero for menor ou igual a zero
	 */

	public void setNumero(int numero) throws Exception {
		if (numero <= 0) {
			throw new Exception("Numero invalido.");
		} 
		
		this.numero = numero;
	}

	/**
	 * Mostra o CEP do endereco.
	 * @return String - O CEP do endereco
	 */

	public String getCep() {
		return cep;
	}

	/**
	 * Muda o CEP do endereco.
	 * @param CEP String - O novo CEP
	 * @throws Exception Se o CEP for nulo, vaziou ou contiver caracteres nao-numericos
	 */

	public void setCep(String cep) throws Exception {
		if (cep.trim().isEmpty() || cep == null || validaCEP(cep)) {
			throw new Exception("CEP invalido.");
		}
		
		this.cep = cep;
	}
	
	/**
	 * Mostra a observacao do endereco
	 * @return A observacao do endereco
	 */
	public String getObs() {
		return observacao;
	}
	
	/**
	 * Muda a observacao do endereco
	 * @param observacao
	 */
	public void setObs(String observacao) throws Exception {
		if (observacao == null) {
			throw new Exception("Observacao invalida.");
		}
		this.observacao = observacao;
	}

	// Verifica a validade do CEP informado
	
	private boolean validaCEP(String CEP) {
		
		if (CEP.length() != 8) {
			return false;
		}
		
		char[] arrayDeDigitos = CEP.toCharArray();

		for (int i = 0; i < arrayDeDigitos.length; i++) {
			if (!Character.isDigit(arrayDeDigitos[i])) {
				return false;
			}
		}

		return true;
	}
}
